#include <signal.h>
#include <setjmp.h>
#include <time.h>
#include "../ourhdr.h"

/****
 * 信号栈
 **/

static void sig_usr1(int), sig_alrm(int);
static sigjmp_buf jmpbuf;
static volatile sig_atomic_t canjump;

int main(void)
{
    if(signal(SIGUSR1, sig_usr1) == SIG_ERR)
    {
        err_sys("signal(SIGUSR1) error");
    }
    if(signal(SIGALRM, sig_alrm) == SIG_ERR)
    {
        err_sys("signal(SIGALRM) error");
    }
    pr_mask("starting main: ");
    if(sigsetjmp(jmpbuf,1))
    {
        pr_mask("ending main: ");
        exit(1);
    }
    canjump = 1;
    for(;;)
    {
        pause();
    }
}

static void sig_usr1(int signo)
{
    time_t starttime;
    if(canjump == 0)
    {
        return;
    }
    pr_mask("starting sig_usr1: ");
    alarm(3);
    starttime = time(NULL);
    for(;;)
    {
        if(time(NULL) > starttime + 5)
        {
            break;
        }
    }
    pr_mask("finishing sig_usr1: ");
    canjump = 0;
    siglongjmp(jmpbuf, 1);
}

static void sig_alrm(int signo)
{
    pr_mask("in sig_alrm: ");
    return;
}